package cn.highedu.coolsharkhub.service.impl;

import cn.highedu.coolsharkhub.service.UploadService;
import cn.highedu.coolsharkhub.service.exception.BlankParameterException;
import cn.highedu.coolsharkhub.service.exception.FileSaveException;
import cn.highedu.coolsharkhub.service.exception.FileSuffixNotAllowedException;
import jakarta.annotation.PostConstruct;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Set;
import java.util.UUID;


/**
 * 上传服务实现类
 * 用于处理上传相关的请求
 * @author HighEDU
 */
@Service
public class UploadServiceImpl implements UploadService {
    private Logger logger = LoggerFactory.getLogger(UploadServiceImpl.class);

    /**
     * 上传文件存储路径，从配置文件中读取
     */
    @Value("${upload.location}")
    private File storagePath;

    /**
     * 允许上传的文件后缀名，从配置文件中读取
     */
    @Value("${upload.suffixes}")
    private Set<String> suffixes;

    /**
     * 初始化 上传文件存储路径
     * 如果不存在则创建
     * 在项目启动时执行
     */
    @PostConstruct
    public void init() {
        // 创建存储路径
        logger.info("storagePath: {}", storagePath);
        if (!storagePath.exists()) {
            storagePath.mkdirs();
        }
    }

    /**
     * 保存上传文件
     * @param file 上传的文件
     */
    @Override
    public String saveUploadFile(MultipartFile file) {
        if (file == null || file.isEmpty()) {
            logger.info("文件为空, 或者上传控件名称不是imageFile");
            throw new BlankParameterException("文件为空，或者上传控件名称不是imageFile");
        }
        // 获取文件名
        String fileName = file.getOriginalFilename();
        logger.info("原始文件名: {}", fileName);
        // 获取文件后缀
        String suffix = fileName.substring(fileName.lastIndexOf(".")).toLowerCase();
        if (!suffixes.contains(suffix)) {
            logger.info("文件后缀名不合法: {}", suffix);
            throw new FileSuffixNotAllowedException("文件后缀名不合法");
        }
        // 生成新的文件名 防止文件名重复
        fileName = UUID.randomUUID() + suffix;
        // 获取当前日期
        LocalDate date = LocalDate.now();
        // 格式化日期
        String datePath = date.format(DateTimeFormatter.ofPattern("/yyyy/MM/dd/"));
        // 创建文件夹 用于存储文件 以日期为单位
        File dirFile = new File(storagePath, datePath);
        if (!dirFile.exists()) {
            dirFile.mkdirs();
        }
        logger.info("文件存储路径: {}", dirFile.getAbsolutePath());
        // 保存文件
        try {
            file.transferTo(new File(dirFile, fileName));
            logger.info("文件保存成功 {} ", datePath + fileName);
            // 返回文件存储路径
            return datePath + fileName;
        } catch (Exception e) {
            logger.error("文件保存失败", e);
            //服务端保存文件失败
            throw new FileSaveException("文件保存失败");
        }
    }
}
